#include "ConsoleUtils.h"

// ----------------------------------------------------
// ANSI 颜色码定义 (Linux/macOS 终端支持)
// 如果你的终端不支持颜色，请移除这些宏
#define ANSI_COLOR_RED      "\x1b[31m"
#define ANSI_COLOR_GREEN    "\x1b[32m"
#define ANSI_COLOR_YELLOW   "\x1b[33m"
#define ANSI_COLOR_BLUE     "\x1b[34m"
#define ANSI_COLOR_MAGENTA  "\x1b[35m"
#define ANSI_COLOR_CYAN     "\x1b[36m"
#define ANSI_COLOR_RESET    "\x1b[0m"

// 以卡片形式输出搜索结果 JSON 数组
void print_json_cards(const json& search_results) {
    if (!search_results.is_array() || search_results.empty()) {
        std::cout << ANSI_COLOR_YELLOW << "--- No Search Results Found ---" << ANSI_COLOR_RESET << std::endl;
        return;
    }

    std::cout << ANSI_COLOR_CYAN << "═════════════════════════════════════════════════════" << std::endl;
    std::cout << "🔍 Search Results (" << search_results.size() << " Cards)" << std::endl;
    std::cout << "═════════════════════════════════════════════════════" << ANSI_COLOR_RESET << std::endl;

    int card_index = 1;
    for (const auto& item : search_results) {
        if (!item.is_object()) continue;

        // 标题和索引
        std::cout << ANSI_COLOR_GREEN << "[" << card_index << "] " << item.value("title", "No Title") << ANSI_COLOR_RESET << std::endl;

        // 链接
        std::cout << "  " << ANSI_COLOR_BLUE << "🔗 Link: " << ANSI_COLOR_RESET 
                  << item.value("link", "N/A") << std::endl;
        
        // ID
        std::cout << "  " << ANSI_COLOR_MAGENTA << "🆔 ID:   " << ANSI_COLOR_RESET 
                  << item.value("id", 0) << std::endl;

        // 摘要/抽象
        // 使用 std::setw(8) 来辅助对齐
        std::cout << "  " << ANSI_COLOR_YELLOW << "📝 Abstract: " << ANSI_COLOR_RESET 
                  << item.value("abstract", "...") << std::endl;

        // 卡片分隔线
        std::cout << ANSI_COLOR_CYAN << "-----------------------------------------------------" << ANSI_COLOR_RESET << std::endl;

        card_index++;
    }
}

void print_candidates_from_json(const std::string& current_input, const json& candidates_array) {
    
    // 检查传入的 json 对象是否为数组且不为空
    if (!candidates_array.is_array() || candidates_array.empty()) {
        std::cout << ANSI_COLOR_YELLOW << "--- No Valid Candidates Found ---" << ANSI_COLOR_RESET << std::endl;
        return;
    }

    // 1. 输出提示行
    std::cout << ANSI_COLOR_BLUE << "> " << ANSI_COLOR_RESET 
              << ANSI_COLOR_GREEN << current_input << ANSI_COLOR_RESET 
              << std::endl;

    // 2. 输出候选词列表标题
    std::cout << ANSI_COLOR_CYAN << "--- Candidates ---" << ANSI_COLOR_RESET << std::endl;

    int index = 1;
    // 遍历 JSON 数组中的每个元素
    for (const auto& candidate : candidates_array) {
        
        // 确保元素是字符串类型
        if (!candidate.is_string()) {
            std::cerr << ANSI_COLOR_YELLOW << "Warning: Candidate element is not a string, skipping." << ANSI_COLOR_RESET << std::endl;
            continue; 
        }

        // 使用最直接的 get<T>() 转换，理论上在已解析的对象上是最快的（如果兼容性允许）
        // 如果你的环境仍报 type_error.302，请切换回上一个回复中的 dump() 方式。
        std::string final_str;
        try {
            final_str = candidate.get<std::string>();
        } catch (const nlohmann::json::exception& e) {
            // 如果 get<string>() 失败，使用 dump/trim 兜底
            std::string dumped_str = candidate.dump();
            if (dumped_str.length() >= 2 && dumped_str.front() == '"' && dumped_str.back() == '"') {
                 final_str = dumped_str.substr(1, dumped_str.length() - 2);
            } else {
                 continue;
            }
        }
        
        // 打印输出：[索引] 候选词
        std::cout << "  " 
                  << ANSI_COLOR_MAGENTA << "[" << index++ << "] " 
                  << ANSI_COLOR_RESET << final_str
                  << std::endl;
    }
    
    // 3. 结束分隔线
    std::cout << ANSI_COLOR_CYAN << "------------------" << ANSI_COLOR_RESET << std::endl;
}